<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Cache;

class Base extends Api
{
    protected ?\think\Validate $validate = null;

    /**
     * 防抖
     * @param int $userId 用户ID
     * @param string $productId 产品ID
     * @param int $expire 防抖时间, 默认1秒
     * @param string|null $mark 标识符, 通过拼接标识符、用户ID、产品ID来确定唯一键。标识符可不填写
     * @param string $message 错误提示信息
     * @return void 存在重复提交返回提示信息
     */
    function antiShake(int $userId, string $productId, int $expire = 1, string $mark = null, string $message = '当前请求已存在, 请不要重复提交请求！'): void
    {
        $key = is_null($mark) ? 'uid::' . $userId . '-' . $productId : $mark . '::' . 'uid::' . $userId . '-' . $productId;
        $data = Cache::store('redis')->has($key);
        if (!$data) Cache::store('redis')->set($key, $productId, $expire);
        else {
            Cache::store('redis')->set($key, $productId, $expire);
            $this->error($message);
        }
    }

    /**
     * 参数校验
     * @param $data array 参数数据
     * @param $scene string 校验场景
     * @param $batch bool 批量验证
     * @return void
     */
    protected function valid(array $data, string $scene, bool $batch = false)
    {
        $result = $this->validate->scene($scene)->batch($batch)->check($data);
        if ($batch && !$result) {
            $message = '';
            foreach ($this->validate->getError() as $error) {
                $message .= __($error) . ', ';
            }
            $this->error(rtrim($message, ', '));
        }
        if (!$result) {
            $this->error(__($this->validate->getError()));
        }
    }

}